HAL FDCAN initialization and configuration functions migration ¶
The goal of this page is to show how to migrate the initialization sequence using STM32CubeMX2:
Open STM32CubeMX2 FDCAN configuration panel.
Configure the SW layer HAL.
Configure the FDCAN main features.
Configure the additional FDCAN features if needed.
Configure the FDCAN GPIO pins.
Configure the FDCAN DMA(s) if the application requires to use the FDCAN in DMA mode.
Configure the NVIC if the application requires the FDCAN to be used in IT mode.
Generate the code.
HAL FDCAN configuration panel ¶
Create a new project with the STM32CubeMX2, then start the initialization and configuration.
Select the appropriate FDCAN to begin the configuration process.
Configure the FDCAN main features ¶
Configure the main features configuration of the FDCAN.
Configure the FDCAN additional features ¶
Configure the additional feature configuration of the FDCAN if needed.
GPIO configuration ¶
Configure the FDCAN receive and transmit pins.
NVIC configuration ¶
Configure the NVIC Line.
HAL FDCAN generated initialization, setconfig and de-initialization sequences ¶
The FDCAN initialization sequence is generated in the
mx_fdcan1_init
function in
mx_fdcan1.c
file under
$YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.
Related concepts:
|
Topic |
HAL1 Code Snippet |
HAL2 Code Snippet |
|---|---|---|
|
FDCAN init, config and MSp sequences |
static void MX_FDCAN1_Init(void)
{
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.NominalPrescaler = 16;
hfdcan1.Init.NominalTimeSeg1 = 1;
hfdcan1.Init.NominalTimeSeg2 = 1;
hfdcan1.Init.NominalSyncJumpWidth = 1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan1.Init.AutoRetransmission = DISABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
hfdcan1.Init.StdFiltersNbr = 0;
hfdcan1.Init.ExtFiltersNbr = 0;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 1;
hfdcan1.Init.DataTimeSeg2 = 1;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hfdcan->Instance==FDCAN1)
{
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN1;
PeriphClkInit.Fdcan1ClockSelection = RCC_FDCAN1CLKSOURCE_PLL1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_FDCAN1_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
}
|
hal_fdcan_handle_t *mx_fdcan1_init(void)
{
hal_fdcan_config_t fdcan_config;
HAL_RCC_FDCAN_EnableClock();
if (HAL_FDCAN_Init(&hFDCAN1, HAL_FDCAN1) != HAL_OK)
{
return NULL;
}
if (HAL_RCC_FDCAN_SetKernelClkSource(HAL_RCC_FDCAN_CLK_SRC_PLL1Q) != HAL_OK)
{
return NULL;
}
hal_fdcan_nominal_bit_timing_t fdcan_nominal_bit_timing;
fdcan_nominal_bit_timing.nominal_prescaler = 16;
fdcan_nominal_bit_timing.nominal_time_seg1 = 1;
fdcan_nominal_bit_timing.nominal_time_seg2 = 1;
fdcan_nominal_bit_timing.nominal_jump_width = 1;
fdcan_config.nominal_bit_timing = fdcan_nominal_bit_timing;
/* Data bit timing parameters are not used in Classic CAN or non-BRS modes */
fdcan_config.frame_format = HAL_FDCAN_FRAME_FORMAT_CLASSIC_CAN;
fdcan_config.mode = HAL_FDCAN_MODE_NORMAL;
fdcan_config.auto_retransmission = HAL_FDCAN_AUTO_RETRANSMISSION_DISABLE;
fdcan_config.transmit_pause = HAL_FDCAN_TRANSMIT_PAUSE_DISABLE;
fdcan_config.protocol_exception = HAL_FDCAN_PROTOCOL_EXCEPTION_DISABLE;
fdcan_config.std_filters_nbr = 0;
fdcan_config.ext_filters_nbr = 0;
fdcan_config.tx_fifo_queue_mode = HAL_FDCAN_TX_MODE_FIFO;
if (HAL_FDCAN_SetConfig(&hFDCAN1, &fdcan_config) != HAL_OK)
{
return NULL;
}
if (HAL_FDCAN_SetClockDivider(&hFDCAN1, HAL_FDCAN_CLOCK_DIV_1) != HAL_OK)
{
return NULL;
}
/* Configure the global filter acceptance/rejection rules */
hal_fdcan_global_filter_config_t global_filter_cfg;
global_filter_cfg.acceptance_non_matching_std = HAL_FDCAN_NO_MATCH_TO_RX_FIFO_0;
global_filter_cfg.acceptance_non_matching_ext = HAL_FDCAN_NO_MATCH_TO_RX_FIFO_0;
global_filter_cfg.acceptance_remote_std = HAL_FDCAN_REMOTE_REJECT;
global_filter_cfg.acceptance_remote_ext = HAL_FDCAN_REMOTE_REJECT;
if (HAL_FDCAN_SetGlobalFilter(&hFDCAN1, &global_filter_cfg) != HAL_OK)
{
return NULL;
}
HAL_RCC_GPIOF_EnableClock();
hal_gpio_config_t gpio_config;
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_NO;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_LOW;
gpio_config.alternate = HAL_GPIO_AF_9;
HAL_GPIO_Init(HAL_GPIOF, HAL_GPIO_PIN_7 | HAL_GPIO_PIN_8, &gpio_config);
return &hFDCAN1;
}
|
|
FDCAN deinit sequence |
void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan)
{
if(hfdcan->Instance==FDCAN1)
{
__HAL_RCC_FDCAN1_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOF, GPIO_PIN_7|GPIO_PIN_8);
}
}
|
void mx_fdcan1_deinit(void)
{
(void)HAL_FDCAN_DeInit(&hFDCAN1);
HAL_GPIO_DeInit(HAL_GPIOF, HAL_GPIO_PIN_7);
HAL_GPIO_DeInit(HAL_GPIOF, HAL_GPIO_PIN_8);
}
|